# - coding: utf-8 -
import logging
import threading
import lib.itchat as itchat
import io
from PIL import Image

from adapters.wechat_message import handle_text_msg, handle_map_msg, handle_card_msg, handle_note_msg, \
    handle_sharing_msg, handle_picture_msg, handle_recording_msg, handle_attachment_msg, handle_video_msg
from config import GlobalConfig,Config
from core.logger import Logger

# 创建一个日志记录实例
logging.basicConfig(level=logging.INFO)
logger = Logger("WeChatBot")

# 可用的二维码生成接口
# https://api.qrserver.com/v1/create-qr-code/?size=400400&data=https://www.abc.com
# https://api.isoyu.com/qr/?m=1&e=L&p=20&url=https://www.abc.com

def qrCallback(uuid, status, qrcode):
    """
    二维码回调函数，用于展示二维码并生成多个二维码链接。

    :param uuid: 二维码的唯一标识符
    :param status: 二维码的状态
    :param qrcode: 二维码的二进制数据
    """
    if status == "0":
        try:
            img = Image.open(io.BytesIO(qrcode))
            _thread = threading.Thread(target=img.show, args=("QRCode",))
            _thread.setDaemon(True)
            _thread.start()
        except Exception as e:
            logger.error(f"Error displaying QR code: {e}")

        import qrcode

        url = f"https://login.weixin.qq.com/l/{uuid}"

        qr_api1 = "https://api.isoyu.com/qr/?m=1&e=L&p=20&url={}".format(url)
        qr_api2 = "https://api.qrserver.com/v1/create-qr-code/?size=400400&data={}".format(url)
        qr_api3 = "https://api.pwmqr.com/qrcode/create/?url={}".format(url)
        qr_api4 = "https://my.tv.sohu.com/user/a/wvideo/getQRCode.do?text={}".format(url)
        logger.info("You can also scan QRCode in any website below:")
        logger.info(qr_api3)
        logger.info(qr_api4)
        logger.info(qr_api2)
        logger.info(qr_api1)

        qr = qrcode.QRCode(border=1)
        qr.add_data(url)
        qr.make(fit=True)
        qr.print_ascii(invert=True)


def login(hotReload=False):
    """
    微信自动登录函数，支持热加载。

    :param hotReload: 是否使用热加载
    """
    itchat.auto_login(hotReload=hotReload, enableCmdQR=2, qrCallback=qrCallback)
    user_info = itchat.get_friends(update=True)[0]
    GlobalConfig.USER_INFO = user_info
    itchat.run()


def remove_prefix(content, prefixes):
    """
    去除消息内容中的前缀词。

    :param content: 消息内容
    :param prefixes: 前缀词列表
    :return: 去除前缀词后的消息内容
    """
    for prefix in prefixes:
        if content.startswith(prefix):
            return content[len(prefix):].strip()
    return content



@itchat.msg_register(['Text', 'Map', 'Card', 'Note', 'Sharing', 'Picture', 'Recording', 'Attachment', 'Video'],
                     isFriendChat=True, isGroupChat=False, isMpChat=False)
def handler_single_msg(msg):
    """
    处理微信单聊消息的函数，根据消息类型调用相应的处理函数。

    :param msg: 微信消息对象
    """
    try:
        # 记录接收到的消息的来源和内容
        logger.info(f"Received message from {msg['FromUserName']}: {msg['Content'] if msg['Type'] == 'Text' else msg['Type']}")

        # 定义消息处理函数映射
        handlers = {
            'Text': handle_text_msg,
            'Map': handle_map_msg,
            'Card': handle_card_msg,
            'Note': handle_note_msg,
            'Sharing': handle_sharing_msg,
            'Picture': handle_picture_msg,
            'Recording': handle_recording_msg,
            'Attachment': handle_attachment_msg,
            'Video': handle_video_msg
        }

        # 获取对应消息类型的消息处理函数
        handler = handlers.get(msg['Type'])
        # 获取发送消息用户的昵称
        from_user_msg = msg['User']['NickName']
        # 如果存在对应的消息处理函数且发送者不在黑名单中，则调用相应的处理函数
        if handler and from_user_msg in Config.SINGLE_CHAT_ABOUT_WHITELISTS:
            ActualNickName = ""
            handler(msg,ActualNickName)
        # 如果发送者在黑名单中，则忽略消息
        elif from_user_msg not in Config.SINGLE_CHAT_ABOUT_WHITELISTS:
            logger.info(f"Ignore message from {msg['FromUserName']}【{msg['User']['NickName']}】")
        # 如果消息类型未知，则记录警告
        else:
            logger.warning(f"Unknown message type: {msg['Type']}")
    # 异常处理，记录错误信息
    except Exception as e:
        logger.error(f"Error handling message: {e}")



@itchat.msg_register(['Text', 'Map', 'Card', 'Note', 'Sharing', 'Picture', 'Recording', 'Attachment', 'Video'],
                     isFriendChat=False, isGroupChat=True, isMpChat=False)

def handler_group_msg(msg):
    """
    处理微信群聊消息的函数，根据消息类型调用相应的处理函数。
    :param msg: 微信消息对象(群聊)
    """
    msg["Content"] = msg["Content"].replace(u'\u2005 ', u' ')
    try:
        # 记录接收到的消息的来源和内容
        logger.info(f"Received message from {msg['FromUserName']}: {msg['Content'] if msg['Type'] == 'Text' else msg['Type']}")

        # 定义消息处理函数映射
        handlers = {
            'Text': handle_text_msg,
            'Map': handle_map_msg,
            'Card': handle_card_msg,
            'Note': handle_note_msg,
            'Sharing': handle_sharing_msg,
            'Picture': handle_picture_msg,
            'Recording': handle_recording_msg,
            'Attachment': handle_attachment_msg,
            'Video': handle_video_msg
        }

        # 获取对应消息类型的消息处理函数
        handler = handlers.get(msg['Type'])
        # 获取发送消息用户的昵称
        from_user_msg = msg['User']['NickName']

        # 检查消息是否以指定的前缀词之一开头
        content = msg['Content']
        # 判断是否存在前缀词开头
        if content and any(content.startswith(prefix) for prefix in Config.GROUP_CHAT_PREFIX_WORD_CHECK):
            # 如果存在对应的消息处理函数且发送者不在黑名单中，则调用相应的处理函数
            if handler and from_user_msg in Config.GROUP_CHAT_ABOUT_WHITELIST:
                encoded_text = msg
                # 消息to对象
                ActualNickName = msg.get('ActualNickName')
                # 去除前缀词
                encoded_text['Content'] = remove_prefix(encoded_text['Content'], Config.GROUP_CHAT_PREFIX_WORD_CHECK)
                handler(encoded_text,ActualNickName)
            # 如果发送者在黑名单中，则忽略消息
            elif from_user_msg not in Config.GROUP_CHAT_ABOUT_WHITELIST:
                logger.info(f"Ignore message from {msg['FromUserName']}【{from_user_msg}】")
            # 如果消息类型未知，则记录警告
            else:
                logger.warning(f"Unknown message type: {msg['Type']}")
        else:
            logger.info(f"Ignore message without prefix from {msg['FromUserName']}【{from_user_msg}】")
    # 异常处理，记录错误信息
    except Exception as e:
        logger.error(f"Error handling message: {e}")



